home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 014 / uasmls.arc / UASM-STR.BAS (.txt) < prev    next >
Encoding:
GW-BASIC  |  1985-09-02  |  13.0 KB  |  247 lines

  1. 10  '--------------------------------------------------------------------------
  2. 11  '|<UNK! {0009}>UASM-STR  1.12<UNK! {0009}><UNK! {0009}>20 Nov., 1983<UNK! {0009}><UNK! {0009}>White Crane Systems  |
  3. 12  '|<UNK! {0009}>copyright 1983<UNK! {0009}><UNK! {0009}>Guy C. Gordon<UNK! {0009}><UNK! {0009}>3194 Friar Tuck Way  |
  4. 13  '|<UNK! {0009}>  <UNK! {0009}><UNK! {0009}><UNK! {0009}><UNK! {0009}><UNK! {0009}><UNK! {0009}>Doraville, GA 30340  |
  5. 14  '|<UNK! {0009}><UNK! {0009}><UNK! {0009}><UNK! {0009}><UNK! {0009}><UNK! {0009}><UNK! {0009}><UNK! {0009}><UNK! {0009}>     |
  6. 16  '|<UNK! {0009}>This program takes the Unassemble output from UASM-INT and puts in   |
  7. 18  '|<UNK! {0009}>the strings printed with DOSCALL PRINT$ (hex 09) and appends to the  |
  8. 20  '|<UNK! {0009}>output file, (.STR) the assembler data definitions (DB insructions)  |
  9. 22  '|<UNK! {0009}>that are needed to create the strings.  You may also enter up to     |
  10. 30  '|<UNK! {0009}>20 address ranges (from DEBUG) and the program will find all strings |
  11. 32  '|<UNK! {0009}>within that range and append them also.  The program will also try   |
  12. 34  '|<UNK! {0009}>to find variables referenced by a hex address in brackets [hhhh],    |
  13. 36  '|<UNK! {0009}>and FCB's referenced in file I/O DOSCALL's.<UNK! {0009}><UNK! {0009}><UNK! {0009}>     |
  14. 44  '|<UNK! {0009}><UNK! {0009}><UNK! {0009}><UNK! {0009}><UNK! {0009}><UNK! {0009}><UNK! {0009}><UNK! {0009}><UNK! {0009}>     |
  15. 46  '|<UNK! {0009}>Due to the large amount of disk I/O, this program will run fastest   |
  16. 48  '|<UNK! {0009}>with the input and output files on a RAM drive.  If you must put     |
  17. 49  '|<UNK! {0009}>both files on floppies, specify separate drives for input & output.  |
  18. 50  '********************************* NOTICE *********************************
  19. 51  '*          USER SUPPORTED SOFTWARE (With thanks to Andrew Flugelman)     *
  20. 52  '*                                                                        *
  21. 53  '*   A limited license is granted to all users of this program, to make   *
  22. 54  '*   copies of this program and distribute them to other users subject    *
  23. 55  '*   to the following conditions:                                         *
  24. 56  '*           1.  None of the notices or credits are to be bypassed,       *
  25. 57  '*               altered, or removed.                                     *
  26. 58  '*           2.  The program is not to be distributed in modified form.   *
  27. 59  '*               (Users are encouraged to distribute MERGE files.)        *
  28. 60  '*           3.  No fee is to be charged (or any other consideration      *
  29. 61  '*               received) for copying or distributing the program        *
  30. 62  '*               without an express written agreement with                *
  31. 63  '*               White Crane Systems.                                     *
  32. 64  '**************************************************************************
  33. 70  CLS 'PRINT CHR$(27)+"E";   <UNK! {0009}>'CLS for IBM, ESC E for Victor 9000
  34. 71  PRINT "                                UASM-STR
  35. 72  PRINT "              White Crane Systems Unassembler - String Module
  36. 73  PRINT "
  37. 74  PRINT "           If you are using this program and finding it of value
  38. 75  PRINT "      please send  a cash contribution to support its upkeep and
  39. 76  PRINT "      distribution.   Use the UASM system  of programs to  unas-
  40. 77  PRINT "      semble one average length .COM file, look over the results
  41. 78  PRINT "      and calculate how many hours this would have taken you  to
  42. 79  PRINT "      to produce,  multiply by the minimum wage, contribute that
  43. 80  PRINT "      amount and use the programs free thereafter. If that's too
  44. 81  PRINT "      much just send $20.   Supporters will receive  free notice 
  45. 82  PRINT "      of enhancements and updates.
  46. 83  PRINT "           In any case you are encouraged to copy and distribute 
  47. 84  PRINT "      UASM to your friends provided you do so free of charge and
  48. 85  PRINT "      in unmodified form.
  49. 87  PRINT " 
  50. 88  PRINT "                           Guy C. Gordon
  51. 89  PRINT "                           White Crane Systems
  52. 90  PRINT "                           3194 Friar Tuck Way
  53. 91  PRINT "                           Doraville, GA 30340
  54. 92  PRINT " 
  55. 110  <UNK! {0009}>DEFINT A-Z
  56. 120  <UNK! {0009}>MAXS=500: MAXA=20: DIM LIN$(500), S$(500), AA$(20), AZ$(20)
  57. 130  <UNK! {0009}>TRUE=(1=1): FALSE=NOT TRUE: D$="    ": MAXB=200
  58. 140  <UNK! {0009}>CR$=CHR$(13): LF$=CHR$(10): TAB$=CHR$(9): ESC$=CHR$(27): Q$="'"
  59. 150  <UNK! {0009}>DEF FNA=(MID$(D$,1,1)<"0" OR MID$(D$,1,1)>"F" OR MID$(D$,2,1)<"0" OR MID$(D$,2,1)>"F" OR MID$(D$,3,1)<"0" OR MID$(D$,3,1)>"F" OR MID$(D$,4,1)<"0" OR MID$(D$,4,1)>"F")
  60. 160  <UNK! {0009}>PRINT
  61. 170  <UNK! {0009}>INPUT "Enter name of input file [.INT]: ",INFILE$
  62. 180  <UNK! {0009}>  DR=INSTR(INFILE$,":"): EXT=INSTR(INFILE$,".")
  63. 190  <UNK! {0009}>  IF EXT=0 THEN INFILE$=INFILE$+".INT": EXT=INSTR(INFILE$,".")
  64. 200  <UNK! {0009}>  ID$=MID$(INFILE$,DR+1,EXT-DR-1)
  65. 210  <UNK! {0009}>PRINT "Enter name of output file ["ID$;: INPUT ".STR]: ",OUTFILE$
  66. 220  <UNK! {0009}>  IF INSTR(OUTFILE$,":")=LEN(OUTFILE$) THEN OUTFILE$=OUTFILE$+ID$
  67. 230  <UNK! {0009}>  IF INSTR(OUTFILE$,".")=0 THEN OUTFILE$=OUTFILE$+".STR"
  68. 240  <UNK! {0009}>PRINT "Enter name of oiginal binary file ["ID$;:INPUT ".COM]: ",BINFILE$
  69. 250  <UNK! {0009}>  IF INSTR(BINFILE$,":")=LEN(BINFILE$) THEN BINFILE$=BINFILE$+ID$
  70. 260  <UNK! {0009}>  IF INSTR(BINFILE$,".")=0 THEN BINFILE$=BINFILE$+".COM"
  71. 300  '-------------------------------------------------------------------------
  72. 301  '|<UNK! {0009}><UNK! {0009}><UNK! {0009}><UNK! {0009}>OPEN BINARY FILE & READ STRINGS<UNK! {0009}><UNK! {0009}>     |
  73. 302  '-------------------------------------------------------------------------
  74. 310  <UNK! {0009}>PRINT: PRINT TIME$,"Reading "BINFILE$: PRINT
  75. 315  <UNK! {0009}>OPEN BINFILE$ FOR INPUT AS #3: CLOSE #3<UNK! {0009}><UNK! {0009}>'Make sure it's there
  76. 320  <UNK! {0009}>OPEN "R",#3,BINFILE$,1: FIELD #3, 1 AS N$
  77. 325  <UNK! {0009}>'<UNK! {0009}><UNK! {0009}>This open statement limits the .COM file to 32K
  78. 330  <UNK! {0009}>PRINT "Enter String Area addresses from DEBUG.  End list with a blank line."
  79. 340  <UNK! {0009}>PRINT "hhhh kkkk (range) or hhhh (single string address) or hhhh Ln (length)"
  80. 350  <UNK! {0009}>FOR I=1 TO MAXA: LINE INPUT A$
  81. 352  <UNK! {0009}>  BE=INSTR(A$,"-"): IF BE=0 THEN BE=INSTR(A$," "): IF BE=0 THEN BE=INSTR(A$,",")
  82. 354  <UNK! {0009}>  IF BE=0 THEN BE=LEN(A$)+1: IF BE<=1 THEN 400
  83. 360  <UNK! {0009}>  AA$(I)=LEFT$(A$,BE-1): AZ$(I)=MID$(A$,BE+1)
  84. 370  <UNK! {0009}>  IF AZ$(I)="" THEN AZ$(I)=AA$(I)
  85. 380  <UNK! {0009}>NEXT I
  86. 400  '-------------------------------------------------------------------------
  87. 401  '|<UNK! {0009}><UNK! {0009}><UNK! {0009}><UNK! {0009}>LOOP THROUGH ADDRESS RANGES<UNK! {0009}><UNK! {0009}>     |
  88. 402  '-------------------------------------------------------------------------<UNK! {0009}>
  89. 410  <UNK! {0009}>FOR K=1 TO MAXA: IF AA$(K)="" THEN 500
  90. 420  <UNK! {0009}>  START=VAL("&H"+AA$(K)): IF START<&H100 THEN 490
  91. 425  <UNK! {0009}>  IF LEFT$(AZ$(K),1)="l" OR LEFT$(AZ$(K),1)="L" THEN MAXB=VAL("&H"+MID$(AZ$(K),2)): AZ=MAXB+START ELSE AZ=VAL("&H"+AZ$(K)): MAXB=200
  92. 430  <UNK! {0009}>  IF START>AZ THEN 490
  93. 440  <UNK! {0009}>    GOSUB 1200<UNK! {0009}><UNK! {0009}><UNK! {0009}>'Get string up to $ terminator
  94. 450  <UNK! {0009}>    IF START<&H1000 THEN LIN$(L)="0"+HEX$(START) ELSE LIN$(L)=HEX$(START)
  95. 460  <UNK! {0009}>    PRINT "D";LIN$(L);TAB$;"DB";TAB$;S$(L)
  96. 470  <UNK! {0009}>    START=I+&H100
  97. 480  <UNK! {0009}>  GOTO 430<UNK! {0009}> <UNK! {0009}>
  98. 490  <UNK! {0009}>NEXT K
  99. 500  '------------------------------------------------------------------------
  100. 501  '|<UNK! {0009}><UNK! {0009}><UNK! {0009}><UNK! {0009}>     OPEN FILES<UNK! {0009}><UNK! {0009}><UNK! {0009}>            |
  101. 502  '------------------------------------------------------------------------
  102. 510  <UNK! {0009}>PRINT: PRINT TIME$,"Reading "INFILE$
  103. 520  <UNK! {0009}>PRINT ,"Writing "OUTFILE$: PRINT
  104. 530  <UNK! {0009}>OPEN  INFILE$ FOR  INPUT AS #1
  105. 540  <UNK! {0009}>OPEN OUTFILE$ FOR OUTPUT AS #2
  106. 600  '------------------------------------------------------------------------
  107. 601  '|<UNK! {0009}><UNK! {0009}><UNK! {0009}><UNK! {0009}>     MAIN LOOP<UNK! {0009}><UNK! {0009}><UNK! {0009}><UNK! {0009}>    | 
  108. 602  '------------------------------------------------------------------------ 
  109. 610  <UNK! {0009}>LINE INPUT #1,A$
  110. 620  <UNK! {0009}>FOUND=FALSE
  111. 630  <UNK! {0009}>  IF MID$(A$,9,6)="PRINT$" THEN GOSUB 1000<UNK! {0009}>'Get String
  112. 635  <UNK! {0009}><UNK! {0009}>IF FOUND=TRUE THEN 680
  113. 640  <UNK! {0009}>  IF MID$(A$,1,7)="DOSCALL" THEN GOSUB 2000<UNK! {0009}>'Check for file I/O
  114. 645  <UNK! {0009}><UNK! {0009}>IF FOUND=TRUE THEN 680
  115. 650  <UNK! {0009}>  IF INSTR(A$,"[") THEN GOSUB 3000<UNK! {0009}><UNK! {0009}>'Get Variable
  116. 655  <UNK! {0009}><UNK! {0009}>IF FOUND=TRUE THEN 680
  117. 660  <UNK! {0009}>  IF MID$(A$,9,3)="MOV" THEN GOSUB 5000<UNK! {0009}><UNK! {0009}>'Check for address
  118. 665  <UNK! {0009}><UNK! {0009}>IF FOUND=TRUE THEN 680
  119. 670  <UNK! {0009}>PRINT #2, A$: GOTO 690<UNK! {0009}><UNK! {0009}><UNK! {0009}><UNK! {0009}>'none found
  120. 680  <UNK! {0009}>PRINT "D";D$;TAB$;"DB";TAB$;S$(I)<UNK! {0009}><UNK! {0009}>'yes, found one
  121. 690  <UNK! {0009}>IF NOT EOF(1) THEN 600
  122. 800  '------------------------------------------------------------------------
  123. 801  '|<UNK! {0009}><UNK! {0009}><UNK! {0009}><UNK! {0009}>WRITE DB STRINGS TO OUTFILE<UNK! {0009}><UNK! {0009}>    |
  124. 802  '------------------------------------------------------------------------
  125. 810  <UNK! {0009}>PRINT #2, ";END CODE"
  126. 820  <UNK! {0009}>PRINT #2, ".RADIX<UNK! {0009}>16"
  127. 830  <UNK! {0009}>PRINT #2, "CR<UNK! {0009}>EQU<UNK! {0009}>0D"
  128. 840  <UNK! {0009}>PRINT #2, "LF<UNK! {0009}>EQU<UNK! {0009}>0A"
  129. 850  <UNK! {0009}>PRINT #2, "TAB<UNK! {0009}>EQU<UNK! {0009}>09"
  130. 860  <UNK! {0009}>PRINT #2, "ESC<UNK! {0009}>EQU<UNK! {0009}>1B"
  131. 870  <UNK! {0009}>PRINT #2, "$<UNK! {0009}>EQU<UNK! {0009}>24"
  132. 900  <UNK! {0009}>'<UNK! {0009}><UNK! {0009}><UNK! {0009}>LOOP THROUGH SAVED STRINGS
  133. 910  <UNK! {0009}>FOR I=1 TO L: PRINT #2, "D";LIN$(I);TAB$;"DB";TAB$;S$(I): NEXT
  134. 920  <UNK! {0009}>'
  135. 930  <UNK! {0009}>PRINT: PRINT TIME$,"UASM-STR Complete"
  136. 999  <UNK! {0009}>END
  137. 1000  '------------------------------------------------------------------------
  138. 1001  '<UNK! {0009}><UNK! {0009}><UNK! {0009}>GET ADDRESS FROM DOSCALL PRINT$<UNK! {0009}><UNK! {0009}><UNK! {0009}>     |
  139. 1002  '------------------------------------------------------------------------
  140. 1010  <UNK! {0009}>LSET D$=MID$(A$,21,4): IF FNA THEN RETURN
  141. 1020  <UNK! {0009}>START=VAL("&H"+D$): IF START<&H100 THEN RETURN<UNK! {0009}>'get string addr
  142. 1030  <UNK! {0009}><UNK! {0009}>'Check for duplicates that are not variables (2 bytes)
  143. 1040  <UNK! {0009}>FOR I=1 TO L: IF ((LIN$(I)=D$) AND (LEN(S$(I))>7)) THEN 1070 ELSE NEXT
  144. 1050  <UNK! {0009}>MAXB=200: GOSUB 1200: LIN$(L)=D$: I=L             <UNK! {0009}>'get string
  145. 1070  <UNK! {0009}>FOUND=TRUE
  146. 1080  <UNK! {0009}>PRINT #2, LEFT$(A$,14);",D";D$;TAB$;";";S$(I)
  147. 1090  <UNK! {0009}>RETURN
  148. 1200  '-----------------------------------------------------------------------
  149. 1201  '|<UNK! {0009}><UNK! {0009}><UNK! {0009}><UNK! {0009}>GET STRING FROM BINARY FILE<UNK! {0009}><UNK! {0009}>    |
  150. 1202  '-----------------------------------------------------------------------
  151. 1210  <UNK! {0009}>INSTRING=FALSE: STR.ERROR=FALSE
  152. 1220  <UNK! {0009}>L=L+1            <UNK! {0009}><UNK! {0009}><UNK! {0009}>'New string
  153. 1230  <UNK! {0009}>I=START-&H100                 <UNK! {0009}><UNK! {0009}>'adjust for 100h program prefix
  154. 1240  <UNK! {0009}>WHILE LEN(S$(L))<110 : I=I+1<UNK! {0009}><UNK! {0009}>'can't let string get too long
  155. 1250  <UNK! {0009}>  IF I>LOF(3) THEN 1800<UNK! {0009}><UNK! {0009}><UNK! {0009}>'or run past the EOF
  156. 1260  <UNK! {0009}>  GET #3, I<UNK! {0009}><UNK! {0009}><UNK! {0009}><UNK! {0009}>'I'th char of file.COM into N$
  157. 1270  <UNK! {0009}>  IF N$="$" THEN 1900<UNK! {0009}><UNK! {0009}><UNK! {0009}>'Found string terminator
  158. 1275  <UNK! {0009}>  IF (I-START+&H100)>MAXB THEN 1920<UNK! {0009}>'Exceeded byte limit
  159. 1280  <UNK! {0009}>  IF N$<" " OR N$>"~" THEN 1500<UNK! {0009}><UNK! {0009}>'non-printing character
  160. 1290  <UNK! {0009}><UNK! {0009}><UNK! {0009}>'Found characters in a string
  161. 1300  <UNK! {0009}>  IF NOT INSTRING THEN S$(L)=S$(L)+Q$: INSTRING=TRUE
  162. 1320  <UNK! {0009}>  S$(L)=S$(L)+N$
  163. 1330  <UNK! {0009}>  GOTO 1700<UNK! {0009}><UNK! {0009}><UNK! {0009}><UNK! {0009}>'Read next character
  164. 1500  '-----------------------------------------------------------------------
  165. 1501  '|<UNK! {0009}><UNK! {0009}><UNK! {0009}><UNK! {0009}>NON-PRINTING CHARACTERS<UNK! {0009}><UNK! {0009}><UNK! {0009}>    |
  166. 1502  '-----------------------------------------------------------------------
  167. 1510  <UNK! {0009}>  IF INSTRING THEN S$(L)=S$(L)+Q$+",":INSTRING=FALSE 'Terminate string
  168. 1520  <UNK! {0009}>  IF N$=CR$  THEN S$(L)=S$(L)+"CR,": GOTO 1700
  169. 1530  <UNK! {0009}>  IF N$=LF$  THEN S$(L)=S$(L)+"LF,": GOTO 1700
  170. 1540  <UNK! {0009}>  IF N$=TAB$ THEN S$(L)=S$(L)+"TAB,": GOTO 1700
  171. 1550  <UNK! {0009}>  IF N$=ESC$ THEN S$(L)=S$(L)+"ESC,": GOTO 1700
  172. 1600  '-----------------------------------------------------------------------
  173. 1601  '|<UNK! {0009}><UNK! {0009}><UNK! {0009}>MAKE NON-PRINTING CHAR A HEX CONSTANT<UNK! {0009}><UNK! {0009}>    |
  174. 1602  '-----------------------------------------------------------------------
  175. 1610  <UNK! {0009}>  IF ((ASC(N$)<&HA0) AND (ASC(N$)>&HF)) THEN S$(L)=S$(L)+HEX$(ASC(N$))+"," ELSE S$(L)=S$(L)+"0"+HEX$(ASC(N$))+","
  176. 1700  <UNK! {0009}>WEND
  177. 1800  <UNK! {0009}>STR.ERROR=TRUE<UNK! {0009}><UNK! {0009}>'Fell through loop
  178. 1900  '-----------------------------------------------------------------------
  179. 1901  '|<UNK! {0009}><UNK! {0009}><UNK! {0009}>TERMINATE STRING AND OUTPUT<UNK! {0009}><UNK! {0009}><UNK! {0009}>    |
  180. 1902  '-----------------------------------------------------------------------
  181. 1910  <UNK! {0009}>S$(L)=S$(L)+"$"
  182. 1920  <UNK! {0009}>IF INSTRING THEN S$(L)=S$(L)+Q$: INSTRING=FALSE
  183. 1950  <UNK! {0009}>IF NOT STR.ERROR THEN RETURN
  184. 1960  <UNK! {0009}>S$(L)=S$(L)+CR$+LF$+TAB$+TAB$+TAB$+"WARNING! String terminator ($) not found"
  185. 1990  <UNK! {0009}>RETURN
  186. 2000  '------------------------------------------------------------------------
  187. 2001  '<UNK! {0009}><UNK! {0009}><UNK! {0009}><UNK! {0009}>CHECK FOR FILE I/O<UNK! {0009}><UNK! {0009}><UNK! {0009}>     |
  188. 2002  '------------------------------------------------------------------------
  189. 2010  <UNK! {0009}>IF ((MID$(A$,9,4)="READ") OR (MID$(A$,9,4)="WRIT")) THEN 2100
  190. 2020  <UNK! {0009}>IF ((MID$(A$,9,4)="OPEN") OR (MID$(A$,9,4)="CLOS")) THEN 2100
  191. 2030  <UNK! {0009}>IF ((MID$(A$,9,4)="SEAR") OR (MID$(A$,9,4)="DELE")) THEN 2100
  192. 2040  <UNK! {0009}>IF ((MID$(A$,9,4)="CREA") OR (MID$(A$,9,4)="RENA")) THEN 2100
  193. 2050  <UNK! {0009}>IF ((MID$(A$,9,4)="SIZE") OR (MID$(A$,9,4)="RAND")) THEN 2100
  194. 2060  <UNK! {0009}>RETURN<UNK! {0009}><UNK! {0009}><UNK! {0009}><UNK! {0009}><UNK! {0009}><UNK! {0009}><UNK! {0009}>     
  195. 2100  '------------------------------------------------------------------------
  196. 2101  '<UNK! {0009}><UNK! {0009}><UNK! {0009}><UNK! {0009}>GET FCB ADDRESS<UNK! {0009}>AND STRING<UNK! {0009}><UNK! {0009}>     |
  197. 2102  '------------------------------------------------------------------------
  198. 2110  <UNK! {0009}>LSET D$=MID$(A$,21,4): IF FNA THEN RETURN
  199. 2120  <UNK! {0009}>START=VAL("&H"+D$): IF START<&H100 THEN 2500<UNK! {0009}>'get string addr
  200. 2130  <UNK! {0009}><UNK! {0009}>'Check for duplicates that are not variables (2 bytes)
  201. 2140  <UNK! {0009}>FOR I=1 TO L: IF ((LIN$(I)=D$) AND (LEN(S$(I))>7)) THEN 2200 ELSE NEXT
  202. 2150  <UNK! {0009}>XFCB=0: I=START-&H100+1: GET #3, I: IF I=&HFF THEN XFCB=7
  203. 2160  <UNK! {0009}>MAXB=36+XFCB: GOSUB 1200: LIN$(L)=D$: I=L            <UNK! {0009}>'Get string
  204. 2200  '------------------------------------------------------------------------
  205. 2201  '<UNK! {0009}><UNK! {0009}><UNK! {0009}><UNK! {0009}>GET FILE NAME FROM FCB & PRINT<UNK! {0009}><UNK! {0009}>     |
  206. 2202  '------------------------------------------------------------------------
  207. 2210  <UNK! {0009}>FOUND=TRUE
  208. 2270  <UNK! {0009}>PRINT #2, LEFT$(A$,14);",D";D$;MID$(A$,25)
  209. 2280  <UNK! {0009}>PRINT #2, TAB$;TAB$;";";S$(I)
  210. 2290  <UNK! {0009}>RETURN
  211. 2500  '------------------------------------------------------------------------
  212. 2501  '<UNK! {0009}><UNK! {0009}><UNK! {0009}><UNK! {0009}>FCB'S IN THE PCP<UNK! {0009}><UNK! {0009}><UNK! {0009}>     |
  213. 2502  '------------------------------------------------------------------------
  214. 2590  <UNK! {0009}>RETURN
  215. 3000  '------------------------------------------------------------------------
  216. 3001  '<UNK! {0009}><UNK! {0009}><UNK! {0009}><UNK! {0009}>GET VARIABLE ADDRESS<UNK! {0009}><UNK! {0009}><UNK! {0009}>     |
  217. 3002  '------------------------------------------------------------------------
  218. 3010  <UNK! {0009}>BE=INSTR(A$,"["): EN=INSTR(A$,"]"): IF EN-BE<>5 THEN RETURN
  219. 3030  <UNK! {0009}>LSET D$=MID$(A$,BE+1,4): IF FNA THEN RETURN
  220. 3040  <UNK! {0009}>START=VAL("&H"+D$): IF START<&H100 THEN RETURN
  221. 3050  <UNK! {0009}><UNK! {0009}><UNK! {0009}><UNK! {0009}><UNK! {0009}><UNK! {0009}>'Found a variable's address
  222. 3060  <UNK! {0009}>FOR I=1 TO L: IF LIN$(I)=D$ THEN 3200 ELSE NEXT<UNK! {0009}>'Check for dups
  223. 3100  '------------------------------------------------------------------------
  224. 3101  '<UNK! {0009}><UNK! {0009}><UNK! {0009}><UNK! {0009}>GET VARIABLE<UNK! {0009}><UNK! {0009}><UNK! {0009}><UNK! {0009}>     |
  225. 3102  '------------------------------------------------------------------------
  226. 3110  <UNK! {0009}>L=L+1            <UNK! {0009}><UNK! {0009}><UNK! {0009}>'New variable
  227. 3120  <UNK! {0009}>I=START-&H100+1                 <UNK! {0009}>'adjust for 100h program prefix
  228. 3130  <UNK! {0009}>IF I>LOF(3) THEN L=L-1: RETURN<UNK! {0009}><UNK! {0009}>'don't run past the EOF
  229. 3140  <UNK! {0009}>  GET #3, I<UNK! {0009}><UNK! {0009}><UNK! {0009}><UNK! {0009}>'I'th char of file.COM into N$
  230. 3150  <UNK! {0009}>  IF ((ASC(N$)<&HA0) AND (ASC(N$)>&HF)) THEN S$(L)=HEX$(ASC(N$)) ELSE S$(L)="0"+HEX$(ASC(N$))
  231. 3160  <UNK! {0009}>  IF I+1>LOF(3) THEN 3200
  232. 3170  <UNK! {0009}>  GET #3, I+1
  233. 3180  <UNK! {0009}>  IF ((ASC(N$)<&HA0) AND (ASC(N$)>&HF)) THEN S$(L)=S$(L)+","+HEX$(ASC(N$))+"," ELSE S$(L)=S$(L)+","+"0"+HEX$(ASC(N$))
  234. 3190  <UNK! {0009}>LIN$(L)=D$: I=L              
  235. 3200  <UNK! {0009}>FOUND=TRUE
  236. 3210  <UNK! {0009}>PRINT #2, LEFT$(A$,BE-1);"D";D$;MID$(A$,EN+1);TAB$;";";S$(I)
  237. 3290  <UNK! {0009}>RETURN
  238. 5000  '------------------------------------------------------------------------
  239. 5001  '|<UNK! {0009}><UNK! {0009}><UNK! {0009}>SEE IF AN ADDRESS IS BEING LOADED <UNK! {0009}><UNK! {0009}>     |
  240. 5002  '------------------------------------------------------------------------
  241. 5010  <UNK! {0009}>LSET D$=MID$(A$,20,4): IF FNA THEN RETURN
  242. 5050  <UNK! {0009}>FOR I=1 TO L: IF LIN$(I)<>D$ THEN NEXT: RETURN
  243. 5060  <UNK! {0009}>FOUND=TRUE<UNK! {0009}><UNK! {0009}><UNK! {0009}><UNK! {0009}><UNK! {0009}>'Found an address!
  244. 5080  <UNK! {0009}>PRINT #2, LEFT$(A$,19);"D";D$;MID$(A$,24);TAB$;";";S$(I)
  245. 5090  <UNK! {0009}>RETURN
  246. 6000  'End of program UASM-STR
  247.